home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / Kasumi / source / a_resample_mmx.asm < prev    next >
Encoding:
Assembly Source File  |  2006-08-03  |  32.3 KB  |  1,569 lines

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Graphics support library
  3. ;    Copyright (C) 1998-2004 Avery Lee
  4. ;
  5. ;    This program is free software; you can redistribute it and/or modify
  6. ;    it under the terms of the GNU General Public License as published by
  7. ;    the Free Software Foundation; either version 2 of the License, or
  8. ;    (at your option) any later version.
  9. ;
  10. ;    This program is distributed in the hope that it will be useful,
  11. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ;    GNU General Public License for more details.
  14. ;
  15. ;    You should have received a copy of the GNU General Public License
  16. ;    along with this program; if not, write to the Free Software
  17. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ;
  19.     .686
  20.     .mmx
  21.     .xmm
  22.     .model    flat
  23.  
  24.     assume fs:_DATA
  25.  
  26.     .const
  27.  
  28. x0002000200020002    dq    0002000200020002h
  29. x0004000400040004    dq    0004000400040004h
  30. x0008000800080008    dq    0008000800080008h
  31. x0000200000002000    dq    0000200000002000h
  32.  
  33.     align 16
  34. MMX_roundval        dq    0000200000002000h, 0000200000002000h
  35.  
  36.  
  37. ;**************************************************************************
  38.  
  39.     .const
  40.  
  41. x0000FFFF0000FFFF    dq    0000FFFF0000FFFFh
  42. x0000010100000101    dq    0000010100000101h
  43. x0100010001000100    dq    0100010001000100h
  44.  
  45.     .code
  46.  
  47. ;--------------------------------------------------------------------------
  48. ;_vdasm_resize_interp_row_run_MMX(
  49. ;    [esp+ 4] void *dst,
  50. ;    [esp+ 8] void *src,
  51. ;    [esp+12] ulong width,
  52. ;    [esp+16] __int64 xaccum,
  53. ;    [esp+24] __int64 x_inc);
  54. ;
  55. _vdasm_resize_interp_row_run_MMX    proc near public
  56.     push    ebp
  57.     push    edi
  58.     push    esi
  59.     push    ebx
  60.  
  61.     mov        esi, [esp+8+16]
  62.     mov        edi, [esp+4+16]
  63.     mov        ebp, [esp+12+16]
  64.  
  65.     movd    mm4, dword ptr [esp+16+16]
  66.     pxor    mm7, mm7
  67.     movd    mm6, dword ptr [esp+24+16]
  68.     punpckldq mm4, mm4
  69.     punpckldq mm6, mm6
  70.  
  71.     shr        esi, 2
  72.  
  73.     mov        eax, [esp+16+16]
  74.     mov        ebx, [esp+20+16]
  75.     add        esi, ebx
  76.     mov        ebx, [esp+24+16]
  77.     mov        ecx, [esp+28+16]
  78.  
  79.     shl        ebp,2
  80.     add        edi,ebp
  81.     neg        ebp
  82.  
  83. @colloop:
  84.     movd        mm1, dword ptr [esi*4+4]
  85.     movq        mm5, mm4
  86.  
  87.     movd        mm0, dword ptr [esi*4]
  88.     punpcklbw    mm1, mm7
  89.  
  90.     punpcklbw    mm0, mm7
  91.     psrld        mm5, 24
  92.  
  93.     movq        mm3, x0100010001000100
  94.     packssdw    mm5, mm5
  95.  
  96.     pmullw        mm1, mm5
  97.     psubw        mm3, mm5
  98.  
  99.     pmullw        mm0, mm3
  100.     paddd        mm4, mm6
  101.  
  102.     ;stall
  103.     ;stall
  104.  
  105.     ;stall
  106.     ;stall
  107.  
  108.     paddw        mm0, mm1
  109.  
  110.     psrlw        mm0, 8
  111.     add            eax, ebx
  112.  
  113.     adc            esi, ecx
  114.     packuswb    mm0, mm0
  115.  
  116.     movd        dword ptr [edi+ebp],mm0
  117.  
  118.     add            ebp, 4
  119.     jnz            @colloop
  120.  
  121.     pop        ebx
  122.     pop        esi
  123.     pop        edi
  124.     pop        ebp
  125.     ret
  126. _vdasm_resize_interp_row_run_MMX    endp
  127.  
  128.  
  129.  
  130. ;**************************************************************************
  131.  
  132. ;vdasm_resize_interp_col_run_MMX(
  133. ;    [esp+ 4] void *dst,
  134. ;    [esp+ 8] void *src1,
  135. ;    [esp+12] void *src2,
  136. ;    [esp+16] ulong width,
  137. ;    [esp+20] ulong yaccum);
  138.  
  139.  
  140. _vdasm_resize_interp_col_run_MMX    proc near public
  141.     push    ebp
  142.     push    edi
  143.     push    esi
  144.     push    ebx
  145.  
  146.     mov        esi, [esp+8+16]
  147.     mov        edx, [esp+12+16]
  148.     mov        edi, [esp+4+16]
  149.     mov        ebp, [esp+16+16]
  150.  
  151.     movd    mm4, dword ptr [esp+20+16]
  152.     pxor    mm7, mm7
  153.     punpcklwd mm4, mm4
  154.     punpckldq mm4, mm4
  155.     psrlw    mm4, 8
  156.     pxor    mm4, x0000FFFF0000FFFF
  157.     paddw    mm4, x0000010100000101
  158.  
  159.     shl        ebp, 2
  160.     add        edi, ebp
  161.     add        esi, ebp
  162.     add        edx, ebp
  163.     neg        ebp
  164.  
  165. @colloop:
  166.     movd    mm0, dword ptr [esi+ebp]
  167.     movd    mm2, dword ptr [edx+ebp]
  168.  
  169.     punpcklbw    mm0, mm7
  170.     punpcklbw    mm2, mm7
  171.  
  172.     movq        mm1, mm0
  173.     punpcklwd    mm0, mm2
  174.     punpckhwd    mm1, mm2
  175.  
  176.     pmaddwd        mm0, mm4
  177.     pmaddwd        mm1, mm4
  178.  
  179.     psrad        mm0, 8
  180.     psrad        mm1, 8
  181.  
  182.     packssdw    mm0, mm1
  183.     packuswb    mm0, mm0
  184.  
  185.     movd        dword ptr [edi+ebp],mm0
  186.  
  187.     add            ebp, 4
  188.     jnz            @colloop
  189.  
  190.     pop        ebx
  191.     pop        esi
  192.     pop        edi
  193.     pop        ebp
  194.     ret
  195. _vdasm_resize_interp_col_run_MMX    endp
  196.  
  197.  
  198. ;--------------------------------------------------------------------------
  199. ;vdasm_resize_ccint_row_MMX(dst, src, count, xaccum, xinc, tbl);
  200.  
  201. _vdasm_resize_ccint_row_MMX        proc    near public
  202.     push    ebx
  203.     push    esi
  204.     push    edi
  205.     push    ebp
  206.  
  207.     mov        ebx, [esp+4+16]        ;ebx = dest addr
  208.     mov        ecx, [esp+12+16]    ;ecx = count
  209.  
  210.     mov        ebp, [esp+20+16]    ;ebp = increment
  211.     mov        edi, ebp            ;edi = increment
  212.     shl        ebp, 16                ;ebp = fractional increment
  213.     mov        esi, [esp+16+16]    ;esi = 16:16 position
  214.     sar        edi, 16                ;edi = integer increment
  215.     mov        [esp+20+16], ebp    ;xinc = fractional increment
  216.     mov        ebp, esi            ;ebp = 16:16 position
  217.     shr        esi, 16                ;esi = integer position
  218.     shl        ebp, 16                ;ebp = fraction
  219.     mov        [esp+16+16], ebp    ;xaccum = fraction
  220.  
  221.     mov        eax, [esp+8+16]
  222.  
  223.     shr        ebp, 24                ;ebp = fraction (0...255)
  224.     mov        [esp+8+16], edi
  225.     shl        ebp, 4                ;ebp = fraction*16
  226.     mov        edi, ebp
  227.     mov        ebp, [esp+4+16]        ;ebp = destination
  228.  
  229.     shr        eax, 2
  230.     add        eax, esi
  231.     shl        ecx, 2                ;ecx = count*4
  232.     lea        ebp, [ebp+ecx-4]
  233.     neg        ecx                    ;ecx = -count*4
  234.  
  235.     movq        mm6,x0000200000002000
  236.     pxor        mm7,mm7
  237.  
  238.     mov            edx,[esp+16+16]        ;edx = fractional accumulator
  239.     mov            esi,[esp+20+16]        ;esi = fractional increment
  240.  
  241.     mov            ebx,[esp+24+16]        ;ebx = coefficient pointer
  242.  
  243.     movd        mm0,dword ptr [eax*4]
  244.     movd        mm1,dword ptr [eax*4+4]
  245.     punpcklbw    mm0,mm7                ;mm0 = [a1][r1][g1][b1]
  246.  
  247.     ;borrow stack pointer
  248.     push        0                    ;don't crash
  249.     push        fs:dword ptr [0]
  250.     mov            fs:dword ptr [0], esp
  251.     mov            esp, [esp+8+24]        ;esp = integer increment
  252.     jmp            short ccint_loop_MMX_start
  253.  
  254.     ;EAX    source pointer / 4
  255.     ;EBX    coefficient pointer
  256.     ;ECX    count
  257.     ;EDX    fractional accumulator
  258.     ;ESI    fractional increment
  259.     ;EDI    coefficient offset
  260.     ;ESP    integer increment
  261.     ;EBP    destination pointer
  262.  
  263.     align        16
  264. ccint_loop_MMX:
  265.     movd        mm0,dword ptr [eax*4]
  266.     packuswb    mm2,mm2                ;mm0 = [a][r][g][b][a][r][g][b]
  267.  
  268.     movd        mm1,dword ptr [eax*4+4]
  269.     punpcklbw    mm0,mm7                ;mm0 = [a1][r1][g1][b1]
  270.  
  271.     movd        dword ptr [ebp+ecx],mm2
  272. ccint_loop_MMX_start:
  273.     movq        mm4,mm0                ;mm0 = [a1][r1][g1][b1]
  274.  
  275.     movd        mm2,dword ptr [eax*4+8]
  276.     punpcklbw    mm1,mm7                ;mm1 = [a2][r2][g2][b2]
  277.  
  278.     movd        mm3,dword ptr [eax*4+12]
  279.     punpcklbw    mm2,mm7                ;mm2 = [a3][r3][g3][b3]
  280.  
  281.     punpcklbw    mm3,mm7                ;mm3 = [a4][r4][g4][b4]
  282.     movq        mm5,mm2                ;mm2 = [a3][r3][g3][b3]
  283.  
  284.     add            edx,esi                ;add fractional increment
  285.     punpcklwd    mm0,mm1                ;mm0 = [g2][g1][b2][b1]
  286.  
  287.     pmaddwd        mm0,[ebx+edi]
  288.     punpcklwd    mm2,mm3                ;mm2 = [g4][g3][b4][b3]
  289.  
  290.     pmaddwd        mm2,[ebx+edi+8]
  291.     punpckhwd    mm4,mm1                ;mm4 = [a2][a1][r2][r1]
  292.  
  293.     pmaddwd        mm4,[ebx+edi]
  294.     punpckhwd    mm5,mm3                ;mm5 = [a4][a3][b4][b3]
  295.  
  296.     pmaddwd        mm5,[ebx+edi+8]
  297.     paddd        mm0,mm6
  298.  
  299.     adc            eax,esp                ;add integer increment and fractional bump to offset
  300.     mov            edi,0ff000000h
  301.  
  302.     paddd        mm2,mm0                ;mm0 = [ g ][ b ]
  303.     paddd        mm4,mm6
  304.  
  305.     psrad        mm2,14
  306.     paddd        mm4,mm5                ;mm4 = [ a ][ r ]
  307.  
  308.     and            edi,edx
  309.     psrad        mm4,14
  310.  
  311.     shr            edi,20                ;edi = fraction (0...255)*16
  312.     add            ecx,4
  313.  
  314.     packssdw    mm2,mm4                ;mm0 = [ a ][ r ][ g ][  b ]
  315.     jnc            ccint_loop_MMX
  316.  
  317.     packuswb    mm2,mm2                ;mm0 = [a][r][g][b][a][r][g][b]
  318.     movd        dword ptr [ebp],mm2
  319.  
  320.     mov        esp, fs:dword ptr [0]
  321.     pop        fs:dword ptr [0]
  322.     pop        eax
  323.  
  324.     pop        ebp
  325.     pop        edi
  326.     pop        esi
  327.     pop        ebx
  328.     ret
  329. _vdasm_resize_ccint_row_MMX        endp
  330.  
  331. ;--------------------------------------------------------------------------
  332. ;vdasm_resize_ccint_col_MMX(dst, src1, src2, src3, src4, count, tbl);
  333.  
  334. _vdasm_resize_ccint_col_MMX    proc near public
  335.     push    ebx
  336.     push    esi
  337.     push    edi
  338.     push    ebp
  339.  
  340.     mov        ebp, [esp+4+16]    ;ebp = dest addr
  341.     mov        esi, [esp+24+16]    ;esi = count
  342.     add        esi, esi
  343.     add        esi, esi
  344.  
  345.     mov        eax, [esp+8+16]    ;eax = row 1
  346.     mov        ebx, [esp+12+16]    ;ebx = row 2
  347.     mov        ecx, [esp+16+16]    ;ecx = row 3
  348.     mov        edx, [esp+20+16]    ;edx = row 4
  349.     mov        edi, [esp+28+16]    ;edi = coefficient ptr
  350.     
  351.     add        eax, esi
  352.     add        ebx, esi
  353.     add        ecx, esi
  354.     add        edx, esi
  355.     add        ebp, esi
  356.     neg        esi
  357.  
  358.     movq        mm4,[edi]
  359.     movq        mm5,[edi+8]
  360.     movq        mm6,x0000200000002000
  361.     pxor        mm7,mm7
  362.  
  363.     movd        mm2,dword ptr [eax+esi]
  364.     movd        mm1,dword ptr [ebx+esi]        ;mm1 = pixel1
  365.     punpcklbw    mm2,mm7
  366.     jmp        short ccint_col_loop_MMX@entry
  367.  
  368.     align        16
  369. ccint_col_loop_MMX:
  370.     movd        mm2,dword ptr [eax+esi]        ;mm2 = pixel0
  371.     packuswb    mm0,mm0
  372.     
  373.     movd        mm1,dword ptr [ebx+esi]        ;mm1 = pixel1
  374.     pxor        mm7,mm7
  375.  
  376.     movd        dword ptr [ebp+esi-4],mm0
  377.     punpcklbw    mm2,mm7
  378.     
  379. ccint_col_loop_MMX@entry:    
  380.     punpcklbw    mm1,mm7
  381.     movq        mm0,mm2
  382.     
  383.     movd        mm3,dword ptr [edx+esi]        ;mm3 = pixel3
  384.     punpcklwd    mm0,mm1            ;mm0 = [g1][g0][b1][b0]
  385.     
  386.     pmaddwd        mm0,mm4
  387.     punpckhwd    mm2,mm1            ;mm2 = [a1][a0][r1][r0]
  388.     
  389.     movd        mm1,dword ptr [ecx+esi]        ;mm1 = pixel2
  390.     punpcklbw    mm3,mm7
  391.         
  392.     pmaddwd        mm2,mm4
  393.     punpcklbw    mm1,mm7
  394.     
  395.     movq        mm7,mm1
  396.     punpcklwd    mm1,mm3            ;mm1 = [g3][g2][b3][b2]
  397.     
  398.     punpckhwd    mm7,mm3            ;mm7 = [a3][a2][r3][r2]
  399.     pmaddwd        mm1,mm5
  400.     
  401.     pmaddwd        mm7,mm5
  402.     paddd        mm0,mm6
  403.     
  404.     paddd        mm2,mm6
  405.     paddd        mm0,mm1
  406.     
  407.     paddd        mm2,mm7
  408.     psrad        mm0,14
  409.     
  410.     psrad        mm2,14
  411.     add            esi,4
  412.     
  413.     packssdw    mm0,mm2
  414.     jne            ccint_col_loop_MMX
  415.     
  416.     packuswb    mm0,mm0
  417.     movd        dword ptr [ebp-4],mm0
  418.  
  419.     pop        ebp
  420.     pop        edi
  421.     pop        esi
  422.     pop        ebx
  423.     ret
  424. _vdasm_resize_ccint_col_MMX    endp    
  425.  
  426. ;--------------------------------------------------------------------------
  427. ;vdasm_resize_ccint_col_SSE2(dst, src1, src2, src3, src4, count, tbl);
  428.  
  429. _vdasm_resize_ccint_col_SSE2    proc near public
  430.     push    ebx
  431.     push    esi
  432.     push    edi
  433.     push    ebp
  434.  
  435.     mov    ebp,[esp + 4 + 16]    ;ebp = dest addr
  436.     mov    esi,[esp + 24 + 16]    ;esi = count
  437.     add    esi,esi
  438.     add    esi,esi
  439.  
  440.     mov    eax,[esp + 8 + 16]    ;eax = row 1
  441.     mov    ebx,[esp + 12 + 16]    ;ebx = row 2
  442.     mov    ecx,[esp + 16 + 16]    ;ecx = row 3
  443.     mov    edx,[esp + 20 + 16]    ;edx = row 4
  444.     mov    edi,[esp + 28 + 16]    ;edi = coefficient ptr
  445.     
  446.     neg    esi
  447.  
  448.     add    esi,4
  449.     jz    ccint_col_SSE2_odd
  450.  
  451.     movq        xmm4,qword ptr [edi]
  452.     movq        xmm5,qword ptr [edi+8]
  453.     punpcklqdq    xmm4,xmm4
  454.     punpcklqdq    xmm5,xmm5
  455.     movq        xmm6,x0000200000002000
  456.     punpcklqdq    xmm6,xmm6
  457.     pxor        xmm7,xmm7
  458.  
  459. ;    jmp        short ccint_col_loop_SSE2@entry
  460.  
  461. ;    align        16
  462. ccint_col_loop_SSE2:
  463.     movq        xmm0, qword ptr [eax]
  464.     add            eax, 8
  465.     movq        xmm1, qword ptr [ebx]
  466.     add            ebx, 8
  467.     movq        xmm2, qword ptr [ecx]
  468.     add            ecx, 8
  469.     movq        xmm3, qword ptr [edx]
  470.     add            edx, 8
  471.     punpcklbw    xmm0,xmm1
  472.     punpcklbw    xmm2,xmm3
  473.     movdqa        xmm1,xmm0
  474.     movdqa        xmm3,xmm2
  475.     punpcklbw    xmm0,xmm7
  476.     punpckhbw    xmm1,xmm7
  477.     punpcklbw    xmm2,xmm7
  478.     punpckhbw    xmm3,xmm7
  479.     pmaddwd        xmm0,xmm4
  480.     pmaddwd        xmm1,xmm4
  481.     pmaddwd        xmm2,xmm5
  482.     pmaddwd        xmm3,xmm5
  483.     paddd        xmm0,xmm6
  484.     paddd        xmm1,xmm6
  485.     paddd        xmm0,xmm2
  486.     paddd        xmm1,xmm3
  487.     psrad        xmm0,14
  488.     psrad        xmm1,14
  489.     packssdw    xmm0,xmm1
  490.     packuswb    xmm0,xmm0
  491.     movdq2q        mm0,xmm0    
  492.     movntq        [ebp],mm0
  493.     add        ebp,8
  494.     add        esi,8
  495.     jnc        ccint_col_loop_SSE2
  496.     jnz        ccint_col_SSE2_noodd
  497. ccint_col_SSE2_odd:
  498.     movd        mm0, dword ptr [eax]
  499.     pxor        mm7,mm7
  500.     movd        mm1, dword ptr [ebx]
  501.     movdq2q        mm4,xmm4
  502.     movd        mm2, dword ptr [ecx]
  503.     movdq2q        mm5,xmm5
  504.     movd        mm3, dword ptr [edx]
  505.     movdq2q        mm6,xmm6
  506.     punpcklbw    mm0,mm1
  507.     punpcklbw    mm2,mm3
  508.     movq        mm1,mm0
  509.     movq        mm3,mm2
  510.     punpcklbw    mm0,mm7
  511.     punpckhbw    mm1,mm7
  512.     punpcklbw    mm2,mm7
  513.     punpckhbw    mm3,mm7
  514.     pmaddwd        mm0,mm4
  515.     pmaddwd        mm1,mm4
  516.     pmaddwd        mm2,mm5
  517.     pmaddwd        mm3,mm5
  518.     paddd        mm0,mm6
  519.     paddd        mm2,mm6
  520.     paddd        mm0,mm2
  521.     paddd        mm1,mm3
  522.     psrad        mm0,14
  523.     psrad        mm1,14
  524.     packssdw    mm0,mm1
  525.     packuswb    mm0,mm0
  526.     movd        eax,mm0
  527.     movnti        [ebp],eax
  528.  
  529. ccint_col_SSE2_noodd:
  530.     pop        ebp
  531.     pop        edi
  532.     pop        esi
  533.     pop        ebx
  534.     ret
  535. _vdasm_resize_ccint_col_SSE2    endp
  536.  
  537.  
  538.  
  539. ;-------------------------------------------------------------------------
  540. ;
  541. ;    long resize_table_row_MMX(Pixel *out, Pixel *in, int *filter, int filter_width, PixDim w, long accum, long frac);
  542.  
  543.     .code
  544.  
  545. _vdasm_resize_table_row_MMX    proc    near
  546.     push    ebp
  547.     push    esi
  548.     push    edi
  549.     push    ebx
  550.  
  551.     cmp        dword ptr [esp+16+16], 4
  552.     jz        @accel_4coeff
  553.     cmp        dword ptr [esp+16+16], 6
  554.     jz        @accel_6coeff
  555.     cmp        dword ptr [esp+16+16], 8
  556.     jz        @accel_8coeff
  557.  
  558.     mov    eax,[esp + 24 + 16]
  559.     mov    ebp,[esp + 20 + 16]
  560.     mov    ebx,[esp + 8 + 16]
  561.     mov    edi,[esp + 4 + 16]
  562.  
  563.     mov    esi,eax
  564.     mov    edx,eax
  565.  
  566.     pxor        mm5,mm5
  567.  
  568.     mov        ecx,[esp + 16 + 16]
  569.     shr        ecx,1
  570.     mov        [esp+16+16],ecx
  571.     test    ecx,1
  572.     jnz        pixelloop_odd_pairs
  573.  
  574. pixelloop_even_pairs:
  575.     shr        esi,14
  576.     and        edx,0000ff00h
  577.     and        esi,0fffffffch
  578.  
  579.     mov        ecx,[esp + 16 + 16]
  580.     shr        edx,5
  581.     add        esi,ebx
  582.     imul    edx,ecx
  583.     add        eax,[esp + 28 + 16]
  584.     add        edx,[esp + 12 + 16]
  585.  
  586.     movq    mm6,MMX_roundval
  587.     pxor    mm3,mm3
  588.     movq    mm7,mm6
  589.     pxor    mm2,mm2
  590.  
  591. coeffloop_unaligned_even_pairs:
  592.     movd        mm0,dword ptr [esi+0]
  593.     paddd        mm7,mm2            ;accumulate alpha/red (pixels 2/3)
  594.  
  595.     punpcklbw    mm0,[esi+4]        ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  596.     paddd        mm6,mm3            ;accumulate green/blue (pixels 2/3)
  597.  
  598.     movd        mm2,dword ptr [esi+8]
  599.     movq        mm1,mm0            ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  600.  
  601.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  602.  
  603.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  604.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  605.  
  606.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  607.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  608.  
  609.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  610.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  611.  
  612.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  613.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  614.  
  615.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  616.     paddd        mm7,mm0            ;accumulate alpha/red (pixels 0/1)
  617.  
  618.     paddd        mm6,mm1            ;accumulate green/blue (pixels 0/1)
  619.     add        edx,16
  620.  
  621.     add        esi,16
  622.     sub        ecx,2
  623.  
  624.     jne        coeffloop_unaligned_even_pairs
  625.  
  626.     paddd        mm7,mm2            ;accumulate alpha/red (pixels 2/3)
  627.     paddd        mm6,mm3            ;accumulate green/blue (pixels 2/3)
  628.  
  629.     psrad        mm7,14
  630.     psrad        mm6,14
  631.  
  632.     packssdw    mm6,mm7
  633.     add        edi,4
  634.  
  635.     packuswb    mm6,mm6
  636.     sub        ebp,1
  637.  
  638.     mov    esi,eax
  639.     mov    edx,eax
  640.  
  641.     movd    dword ptr [edi-4],mm6
  642.     jne    pixelloop_even_pairs
  643.  
  644.     pop    ebx
  645.     pop    edi
  646.     pop    esi
  647.     pop    ebp
  648.  
  649.     ret
  650.  
  651. ;----------------------------------------------------------------
  652.  
  653. pixelloop_odd_pairs:
  654.     shr        esi,14
  655.     and        edx,0000ff00h
  656.     and        esi,0fffffffch
  657.  
  658.     mov        ecx,[esp + 16 + 16]
  659.     shr        edx,5
  660.     add        esi,ebx
  661.     imul    edx,ecx
  662.     add        eax,[esp + 28 + 16]
  663.     sub        ecx,1
  664.     add        edx,[esp + 12 + 16]
  665.  
  666.     movq    mm6,MMX_roundval
  667.     pxor    mm3,mm3
  668.     pxor    mm2,mm2
  669.     movq    mm7,mm6
  670.  
  671. coeffloop_unaligned_odd_pairs:
  672.     movd        mm0,dword ptr [esi+0]
  673.     paddd        mm7,mm2            ;accumulate alpha/red (pixels 2/3)
  674.  
  675.     punpcklbw    mm0,[esi+4]        ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  676.     paddd        mm6,mm3            ;accumulate green/blue (pixels 2/3)
  677.  
  678.     movd        mm2,dword ptr [esi+8]
  679.     movq        mm1,mm0            ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  680.  
  681.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  682.  
  683.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  684.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  685.  
  686.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  687.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  688.  
  689.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  690.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  691.  
  692.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  693.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  694.  
  695.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  696.     paddd        mm7,mm0            ;accumulate alpha/red (pixels 0/1)
  697.  
  698.     paddd        mm6,mm1            ;accumulate green/blue (pixels 0/1)
  699.     add        edx,16
  700.  
  701.     add        esi,16
  702.     sub        ecx,2
  703.  
  704.     jne        coeffloop_unaligned_odd_pairs
  705.  
  706.     paddd        mm7,mm2            ;accumulate alpha/red (pixels 2/3)
  707.     paddd        mm6,mm3            ;accumulate green/blue (pixels 2/3)
  708.  
  709.     ;finish up odd pair
  710.  
  711.     movd        mm0,dword ptr [esi]        ;mm0 = [x1][r1][g1][b1]
  712.     punpcklbw    mm0,[esi+4]        ;mm2 = [x0][x1][r0][r1][g0][g1][b0][b1]
  713.     movq        mm1,mm0
  714.     punpcklbw    mm0,mm5            ;mm0 = [g0][g1][b0][b1]
  715.     punpckhbw    mm1,mm5            ;mm1 = [x0][x1][r0][r1]
  716.  
  717.     pmaddwd        mm0,[edx]
  718.     pmaddwd        mm1,[edx]
  719.  
  720.     paddd        mm6,mm0
  721.     paddd        mm7,mm1
  722.  
  723.     ;combine into pixel
  724.  
  725.     psrad        mm6,14
  726.  
  727.     psrad        mm7,14
  728.  
  729.     packssdw    mm6,mm7
  730.     add        edi,4
  731.  
  732.     packuswb    mm6,mm6
  733.     sub        ebp,1
  734.  
  735.     mov        esi,eax
  736.     mov        edx,eax
  737.  
  738.     movd        dword ptr [edi-4],mm6
  739.     jne        pixelloop_odd_pairs
  740.  
  741.     pop    ebx
  742.     pop    edi
  743.     pop    esi
  744.     pop    ebp
  745.  
  746.     ret
  747.  
  748. ;----------------------------------------------------------------
  749.  
  750. @accel_4coeff:
  751.     mov    eax,[esp + 24 + 16]
  752.     mov    ebp,[esp + 20 + 16]
  753.     add    ebp,ebp
  754.     add    ebp,ebp
  755.     mov    ebx,[esp + 8 + 16]
  756.     mov    edi,[esp + 4 + 16]
  757.     add    edi,ebp
  758.     neg    ebp
  759.  
  760.     mov    esi,eax
  761.     mov    edx,eax
  762.  
  763.     movq        mm4,MMX_roundval
  764.     pxor        mm5,mm5
  765.  
  766.     mov        ecx,[esp+12+16]
  767.  
  768. @pixelloop_4coeff:
  769.     shr        esi,14
  770.     and        edx,0000ff00h
  771.     and        esi,0fffffffch
  772.  
  773.     shr        edx,4
  774.     add        esi,ebx
  775.     add        eax,[esp+28+16]
  776.     add        edx,ecx
  777.  
  778.     movd        mm0,dword ptr [esi+0]
  779.     movd        mm2,dword ptr [esi+8]
  780.     punpcklbw    mm0,[esi+4]        ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  781.  
  782.     movq        mm1,mm0            ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  783.  
  784.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  785.  
  786.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  787.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  788.  
  789.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  790.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  791.  
  792.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  793.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  794.  
  795.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  796.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  797.  
  798.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  799.     paddd        mm0,mm4            ;accumulate alpha/red (pixels 0/1)
  800.  
  801.     paddd        mm1,mm4            ;accumulate green/blue (pixels 0/1)
  802.  
  803.     paddd        mm0,mm2            ;accumulate alpha/red (pixels 2/3)
  804.     paddd        mm1,mm3            ;accumulate green/blue (pixels 2/3)
  805.  
  806.     psrad        mm0,14
  807.     psrad        mm1,14
  808.  
  809.     packssdw    mm1,mm0
  810.     mov    esi,eax
  811.  
  812.     packuswb    mm1,mm1
  813.     mov    edx,eax
  814.  
  815.     movd    dword ptr [edi+ebp],mm1
  816.     add        ebp,4
  817.     jne        @pixelloop_4coeff
  818.  
  819.     pop    ebx
  820.     pop    edi
  821.     pop    esi
  822.     pop    ebp
  823.  
  824.     ret
  825.  
  826.  
  827. ;----------------------------------------------------------------
  828.  
  829. @accel_6coeff:
  830.     mov    eax,[esp + 24 + 16]
  831.     mov    ebp,[esp + 20 + 16]
  832.     add    ebp,ebp
  833.     add    ebp,ebp
  834.     mov    ebx,[esp + 8 + 16]
  835.     mov    edi,[esp + 4 + 16]
  836.     add    edi,ebp
  837.     neg    ebp
  838.  
  839.     mov    esi,eax
  840.     mov    edx,eax
  841.  
  842.     movq        mm4,MMX_roundval
  843.     pxor        mm5,mm5
  844.  
  845.     mov        ecx,[esp+12+16]
  846.  
  847. @pixelloop_6coeff:
  848.     shr        esi,14
  849.     and        edx,0000ff00h
  850.     and        esi,0fffffffch
  851.  
  852.     shr        edx,5
  853.     lea        edx,[edx+edx*2]
  854.     add        esi,ebx
  855.     add        eax,[esp+28+16]
  856.     add        edx,ecx
  857.  
  858.     movd        mm0,dword ptr [esi+0]
  859.     movd        mm2,dword ptr [esi+8]
  860.     punpcklbw    mm0,[esi+4]        ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  861.  
  862.     movq        mm1,mm0            ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  863.  
  864.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  865.  
  866.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  867.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  868.  
  869.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  870.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  871.  
  872.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  873.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  874.  
  875.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  876.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  877.  
  878.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  879.     paddd        mm0,mm4            ;accumulate alpha/red (pixels 0/1)
  880.  
  881.     paddd        mm1,mm4            ;accumulate green/blue (pixels 0/1)
  882.  
  883.     paddd        mm0,mm2            ;accumulate alpha/red (pixels 2/3)
  884.     paddd        mm1,mm3            ;accumulate green/blue (pixels 2/3)
  885.  
  886.     movd        mm6,dword ptr [esi+16]
  887.  
  888.     punpcklbw    mm6,[esi+20]    ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  889.  
  890.     movq        mm7,mm6            ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  891.  
  892.     punpckhbw    mm6,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  893.  
  894.     pmaddwd        mm6,[edx+16]    ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  895.     punpcklbw    mm7,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  896.  
  897.     pmaddwd        mm7,[edx+16]    ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  898.     paddd        mm0,mm6            ;accumulate alpha/red (pixels 0/1)
  899.  
  900.     paddd        mm1,mm7            ;accumulate green/blue (pixels 0/1)
  901.  
  902.  
  903.     psrad        mm0,14
  904.     psrad        mm1,14
  905.  
  906.     packssdw    mm1,mm0
  907.     mov    esi,eax
  908.  
  909.     packuswb    mm1,mm1
  910.     mov    edx,eax
  911.  
  912.     movd    dword ptr [edi+ebp],mm1
  913.     add        ebp,4
  914.     jne        @pixelloop_6coeff
  915.  
  916.     pop    ebx
  917.     pop    edi
  918.     pop    esi
  919.     pop    ebp
  920.  
  921.     ret
  922.  
  923. ;----------------------------------------------------------------
  924.  
  925. @accel_8coeff:
  926.     mov    eax,[esp + 24 + 16]
  927.     mov    ebp,[esp + 20 + 16]
  928.     add    ebp,ebp
  929.     add    ebp,ebp
  930.     mov    ebx,[esp + 8 + 16]
  931.     mov    edi,[esp + 4 + 16]
  932.     add    edi,ebp
  933.     neg    ebp
  934.  
  935.     mov    esi,eax
  936.     mov    edx,eax
  937.  
  938.     movq        mm4,MMX_roundval
  939.     pxor        mm5,mm5
  940.  
  941.     mov        ecx,[esp+12+16]
  942.  
  943. @pixelloop_8coeff:
  944.     shr        esi,14
  945.     and        edx,0000ff00h
  946.     and        esi,0fffffffch
  947.  
  948.     shr        edx,3
  949.     add        esi,ebx
  950.     add        eax,[esp+28+16]
  951.     add        edx,ecx
  952.  
  953.     movd        mm0,dword ptr [esi+0]
  954.     movd        mm2,dword ptr [esi+8]
  955.     punpcklbw    mm0,[esi+4]        ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  956.  
  957.     movq        mm1,mm0            ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  958.  
  959.     punpckhbw    mm0,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  960.  
  961.     pmaddwd        mm0,[edx]        ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  962.     punpcklbw    mm2,[esi+12]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  963.  
  964.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  965.     punpcklbw    mm1,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  966.  
  967.     pmaddwd        mm1,[edx]        ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  968.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  969.  
  970.     pmaddwd        mm2,[edx+8]        ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  971.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  972.  
  973.     pmaddwd        mm3,[edx+8]        ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  974.     paddd        mm0,mm4            ;accumulate alpha/red (pixels 0/1)
  975.  
  976.     paddd        mm1,mm4            ;accumulate green/blue (pixels 0/1)
  977.  
  978.     paddd        mm0,mm2            ;accumulate alpha/red (pixels 2/3)
  979.     paddd        mm1,mm3            ;accumulate green/blue (pixels 2/3)
  980.  
  981.  
  982.     movd        mm6,dword ptr [esi+16]
  983.  
  984.     punpcklbw    mm6,[esi+20]    ;mm1=[a0][a1][r0][r1][g0][g1][b0][b1]
  985.  
  986.     movd        mm2,dword ptr [esi+24]
  987.  
  988.     punpcklbw    mm2,[esi+28]    ;mm2=[a2][a3][r2][r3][g2][g3][b2][b3]
  989.     movq        mm7,mm6            ;mm0=[a0][a1][r0][r1][g0][g1][b0][b1]
  990.  
  991.     punpckhbw    mm6,mm5            ;mm0=[ a0 ][ a1 ][ r0 ][ r1 ]
  992.     movq        mm3,mm2            ;mm3=[a2][a3][r2][r3][g2][g3][b2][b3]
  993.  
  994.     pmaddwd        mm6,[edx+16]    ;mm0=[a0*f0+a1*f1][r0*f0+r1*f1]
  995.     punpcklbw    mm7,mm5            ;mm1=[ g0 ][ g1 ][ b0 ][ b1 ]
  996.  
  997.     pmaddwd        mm7,[edx+16]    ;mm1=[g0*f0+g1*f1][b0*f0+b1*f1]
  998.     punpckhbw    mm2,mm5            ;mm2=[ a2 ][ a3 ][ r0 ][ r1 ]
  999.  
  1000.     pmaddwd        mm2,[edx+24]    ;mm2=[a2*f2+a3*f3][r2*f2+r3*f3]
  1001.     punpcklbw    mm3,mm5            ;mm3=[ g2 ][ g3 ][ b2 ][ b3 ]
  1002.  
  1003.     pmaddwd        mm3,[edx+24]    ;mm3=[g2*f2+g3*f3][b2*f2+b3*f3]
  1004.     paddd        mm0,mm6            ;accumulate alpha/red (pixels 0/1)
  1005.  
  1006.     paddd        mm1,mm7            ;accumulate green/blue (pixels 0/1)
  1007.     paddd        mm0,mm2            ;accumulate alpha/red (pixels 0/1)
  1008.  
  1009.     paddd        mm1,mm3            ;accumulate green/blue (pixels 0/1)
  1010.  
  1011.  
  1012.     psrad        mm0,14
  1013.     psrad        mm1,14
  1014.  
  1015.     packssdw    mm1,mm0
  1016.     mov    esi,eax
  1017.  
  1018.     packuswb    mm1,mm1
  1019.     mov    edx,eax
  1020.  
  1021.     movd    dword ptr [edi+ebp],mm1
  1022.     add        ebp,4
  1023.     jne        @pixelloop_8coeff
  1024.  
  1025.     pop    ebx
  1026.     pop    edi
  1027.     pop    esi
  1028.     pop    ebp
  1029.  
  1030.     ret
  1031.  
  1032. _vdasm_resize_table_row_MMX    endp
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039. ;-------------------------------------------------------------------------
  1040. ;
  1041. ;    long resize_table_col_MMX(Pixel *out, Pixel **in_table, int *filter, int filter_width, PixDim w, long frac);
  1042.  
  1043. _vdasm_resize_table_col_MMX    proc    near
  1044.     push        ebp
  1045.     push        esi
  1046.     push        edi
  1047.     push        ebx
  1048.  
  1049.     mov            edx,[esp + 12 + 16]
  1050.     mov            eax,[esp + 24 + 16]
  1051.     shl            eax,2
  1052.     imul        eax,[esp + 16 + 16]
  1053.     add            edx,eax
  1054.     mov            [esp + 12 + 16], edx    ;[esp+12+28] = filter pointer
  1055.  
  1056.     mov            ebp,[esp + 20 + 16]        ;ebp = pixel counter
  1057.     mov            edi,[esp + 4 + 16]        ;edi = destination pointer
  1058.  
  1059.     pxor        mm5,mm5
  1060.  
  1061.     cmp            dword ptr [esp+16+16], 4
  1062.     jz            @accel_4coeff
  1063.     cmp            dword ptr [esp+16+16], 6
  1064.     jz            @accel_6coeff
  1065.  
  1066.     mov            ecx,[esp + 16 + 16]
  1067.     shr            ecx,1
  1068.     mov            [esp + 16 + 16],ecx        ;ecx = filter pair count
  1069.  
  1070.     xor            ebx,ebx                    ;ebx = source offset 
  1071.  
  1072.     mov            ecx,[esp + 16 + 16]        ;ecx = filter width counter
  1073. @pixelloop:
  1074.     mov            eax,[esp + 8 + 16]        ;esi = row pointer table
  1075.     movq        mm6,MMX_roundval
  1076.     movq        mm7,mm6
  1077.     pxor        mm0,mm0
  1078.     pxor        mm1,mm1
  1079. @coeffloop:
  1080.     mov            esi,[eax]
  1081.     paddd        mm6,mm0
  1082.  
  1083.     movd        mm0,dword ptr [esi+ebx]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1084.     paddd        mm7,mm1
  1085.  
  1086.     mov            esi,[eax+4]
  1087.     add            eax,8
  1088.  
  1089.     movd        mm1,dword ptr [esi+ebx]    ;mm1 = [0][0][0][0][x1][r1][g1][b1]
  1090.     punpcklbw    mm0,mm1            ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1091.  
  1092.     movq        mm1,mm0
  1093.     punpcklbw    mm0,mm5            ;mm0 = [g1][g0][b1][b0]
  1094.  
  1095.     pmaddwd        mm0,[edx]
  1096.     punpckhbw    mm1,mm5            ;mm1 = [x1][x0][r1][r0]
  1097.  
  1098.     pmaddwd        mm1,[edx]
  1099.     add            edx,8
  1100.  
  1101.     sub            ecx,1
  1102.     jne            @coeffloop
  1103.  
  1104.     paddd        mm6,mm0
  1105.     paddd        mm7,mm1
  1106.  
  1107.     psrad        mm6,14
  1108.     psrad        mm7,14
  1109.     add            edi,4
  1110.     packssdw    mm6,mm7
  1111.     add            ebx,4
  1112.     packuswb    mm6,mm6
  1113.     sub            ebp,1
  1114.  
  1115.     mov            ecx,[esp + 16 + 16]        ;ecx = filter width counter
  1116.     mov            edx,[esp + 12 + 16]        ;edx = filter bank pointer
  1117.  
  1118.     movd        dword ptr [edi-4],mm6
  1119.     jne            @pixelloop
  1120.  
  1121. @xit:
  1122.     pop        ebx
  1123.     pop        edi
  1124.     pop        esi
  1125.     pop        ebp
  1126.     ret
  1127.  
  1128.  
  1129.  
  1130. @accel_4coeff:
  1131.     movq        mm2,[edx]
  1132.     movq        mm3,[edx+8]
  1133.  
  1134.     mov            esi,[esp+8+16]            ;esi = row pointer table
  1135.     mov            eax,[esi]
  1136.     add            ebp,ebp
  1137.     mov            ebx,[esi+4]
  1138.     add            ebp,ebp
  1139.     mov            ecx,[esi+8]
  1140.     mov            esi,[esi+12]
  1141.     add            eax,ebp
  1142.     add            ebx,ebp
  1143.     add            ecx,ebp
  1144.     add            esi,ebp
  1145.     add            edi,ebp
  1146.     neg            ebp
  1147.  
  1148.     ;EAX    source 0
  1149.     ;EBX    source 1
  1150.     ;ECX    source 2
  1151.     ;ESI    source 3
  1152.     ;EDI    destination
  1153.     ;EBP    counter
  1154.  
  1155.     movq        mm4,MMX_roundval
  1156.  
  1157. @pixelloop4:
  1158.     movd        mm6,dword ptr [eax+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1159.  
  1160.     punpcklbw    mm6,[ebx+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1161.  
  1162.     movq        mm7,mm6
  1163.     punpcklbw    mm6,mm5            ;mm0 = [g1][g0][b1][b0]
  1164.  
  1165.     pmaddwd        mm6,mm2
  1166.     punpckhbw    mm7,mm5            ;mm1 = [x1][x0][r1][r0]
  1167.  
  1168.     movd        mm0,dword ptr [ecx+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1169.     pmaddwd        mm7,mm2
  1170.  
  1171.     punpcklbw    mm0,[esi+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1172.     paddd        mm6,mm4
  1173.  
  1174.     movq        mm1,mm0
  1175.     punpcklbw    mm0,mm5            ;mm0 = [g1][g0][b1][b0]
  1176.  
  1177.     pmaddwd        mm0,mm3
  1178.     punpckhbw    mm1,mm5            ;mm1 = [x1][x0][r1][r0]
  1179.  
  1180.     pmaddwd        mm1,mm3
  1181.     paddd        mm7,mm4
  1182.  
  1183.     paddd        mm6,mm0
  1184.     paddd        mm7,mm1
  1185.  
  1186.     psrad        mm6,14
  1187.     psrad        mm7,14
  1188.     packssdw    mm6,mm7
  1189.     packuswb    mm6,mm6
  1190.  
  1191.     movd        dword ptr [edi+ebp],mm6
  1192.  
  1193.     add            ebp,4
  1194.     jne            @pixelloop4
  1195.     jmp            @xit
  1196.  
  1197. @accel_6coeff:
  1198.     movq        mm2,[edx]
  1199.     movq        mm3,[edx+8]
  1200.     movq        mm4,[edx+16]
  1201.  
  1202.     push        0
  1203.     push        fs:dword ptr [0]
  1204.     mov            fs:dword ptr [0],esp
  1205.  
  1206.     mov            esp,[esp+8+24]            ;esp = row pointer table
  1207.     mov            eax,[esp]
  1208.     add            ebp,ebp
  1209.     mov            ebx,[esp+4]
  1210.     add            ebp,ebp
  1211.     mov            ecx,[esp+8]
  1212.     mov            edx,[esp+12]
  1213.     mov            esi,[esp+16]
  1214.     mov            esp,[esp+20]
  1215.     add            eax,ebp
  1216.     add            ebx,ebp
  1217.     add            ecx,ebp
  1218.     add            edx,ebp
  1219.     add            esi,ebp
  1220.     add            edi,ebp
  1221.     add            esp,ebp
  1222.     neg            ebp
  1223.  
  1224.     ;EAX    source 0
  1225.     ;EBX    source 1
  1226.     ;ECX    source 2
  1227.     ;EDX    source 3
  1228.     ;ESI    source 4
  1229.     ;EDI    destination
  1230.     ;ESP    source 5
  1231.     ;EBP    counter
  1232.  
  1233. @pixelloop6:
  1234.     movd        mm6,dword ptr [eax+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1235.  
  1236.     punpcklbw    mm6,[ebx+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1237.  
  1238.     movq        mm7,mm6
  1239.     punpcklbw    mm6,mm5            ;mm0 = [g1][g0][b1][b0]
  1240.  
  1241.     movd        mm0,dword ptr [ecx+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1242.     punpckhbw    mm7,mm5            ;mm1 = [x1][x0][r1][r0]
  1243.  
  1244.     punpcklbw    mm0,[edx+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1245.     pmaddwd        mm6,mm2
  1246.  
  1247.     movq        mm1,mm0
  1248.     punpcklbw    mm0,mm5            ;mm0 = [g1][g0][b1][b0]
  1249.  
  1250.     pmaddwd        mm7,mm2
  1251.     punpckhbw    mm1,mm5            ;mm1 = [x1][x0][r1][r0]
  1252.  
  1253.     paddd        mm6,MMX_roundval
  1254.     pmaddwd        mm0,mm3
  1255.  
  1256.     paddd        mm7,MMX_roundval
  1257.     pmaddwd        mm1,mm3
  1258.  
  1259.     paddd        mm6,mm0
  1260.  
  1261.     movd        mm0,dword ptr [esi+ebp]    ;mm0 = [0][0][0][0][x0][r0][g0][b0]
  1262.     paddd        mm7,mm1
  1263.  
  1264.     punpcklbw    mm0,[esp+ebp]    ;mm0 = [x0][x1][r0][r1][g0][g1][b0][b1]
  1265.     movq        mm1,mm0
  1266.     punpcklbw    mm0,mm5            ;mm0 = [g1][g0][b1][b0]
  1267.     punpckhbw    mm1,mm5            ;mm1 = [x1][x0][r1][r0]
  1268.     pmaddwd        mm0,mm4
  1269.     pmaddwd        mm1,mm4
  1270.     paddd        mm6,mm0
  1271.     paddd        mm7,mm1
  1272.  
  1273.     psrad        mm6,14
  1274.     psrad        mm7,14
  1275.     packssdw    mm6,mm7
  1276.     packuswb    mm6,mm6
  1277.  
  1278.     movd        dword ptr [edi+ebp],mm6
  1279.  
  1280.     add            ebp,4
  1281.     jne            @pixelloop6
  1282.  
  1283.     mov            esp,fs:dword ptr [0]
  1284.     pop            fs:dword ptr [0]
  1285.     pop            eax
  1286.  
  1287.     jmp            @xit
  1288.  
  1289. _vdasm_resize_table_col_MMX    endp
  1290.  
  1291. _vdasm_resize_table_col_SSE2    proc    near
  1292.     push        ebp
  1293.     push        esi
  1294.     push        edi
  1295.     push        ebx
  1296.  
  1297.     mov            edx,[esp+12+16]
  1298.     mov            eax,[esp+24+16]
  1299.     shl            eax,2
  1300.     imul        eax,[esp+16+16]
  1301.     add            edx,eax
  1302.     mov            [esp+12+16], edx        ;[esp+12+16] = filter pointer
  1303.  
  1304.     mov            ebp,[esp+20+16]        ;ebp = pixel counter
  1305.     mov            edi,[esp+4+16]        ;edi = destination pointer
  1306.  
  1307.     pxor        xmm7, xmm7
  1308.     movdqa        xmm6, xmmword ptr MMX_roundval
  1309.  
  1310.     cmp            dword ptr [esp+16+16], 4
  1311.     jz            @accel_4coeff
  1312.     cmp            dword ptr [esp+16+16], 6
  1313.     jz            @accel_6coeff
  1314.  
  1315.     mov            ecx,[esp+16+16]
  1316.     shr            ecx,1
  1317.     mov            [esp+16+16],ecx        ;ecx = filter pair count
  1318.  
  1319.     xor            ebx,ebx                    ;ebx = source offset 
  1320.  
  1321.     mov            ecx,[esp+16+16]        ;ecx = filter width counter
  1322. @pixelloop:
  1323.     mov            eax, [esp+8+16]        ;esi = row pointer table
  1324.     movdqa        xmm4, xmm6
  1325. @coeffloop:
  1326.     mov            esi,[eax]
  1327.  
  1328.     movd        xmm0, dword ptr [esi+ebx]
  1329.  
  1330.     mov            esi,[eax+4]
  1331.     add            eax,8
  1332.  
  1333.     movd        xmm1, dword ptr [esi+ebx]
  1334.     punpcklbw    xmm0, xmm1
  1335.  
  1336.     punpcklbw    xmm0, xmm7
  1337.  
  1338.     movq        xmm2, qword ptr [edx]
  1339.     pshufd        xmm2, xmm2, 01000100b
  1340.  
  1341.     pmaddwd        xmm0, xmm2
  1342.  
  1343.     paddd        xmm4, xmm0
  1344.  
  1345.     add            edx,8
  1346.  
  1347.     sub            ecx,1
  1348.     jne            @coeffloop
  1349.  
  1350.     psrad        xmm4,14
  1351.     add            edi,4
  1352.     packssdw    xmm4,xmm4
  1353.     add            ebx,4
  1354.     packuswb    xmm4,xmm4
  1355.     sub            ebp,1
  1356.  
  1357.     mov            ecx,[esp+16+16]        ;ecx = filter width counter
  1358.     mov            edx,[esp+12+16]        ;edx = filter bank pointer
  1359.  
  1360.     movd        dword ptr [edi-4],xmm4
  1361.     jne            @pixelloop
  1362.  
  1363. @xit:
  1364.     pop        ebx
  1365.     pop        edi
  1366.     pop        esi
  1367.     pop        ebp
  1368.     ret
  1369.  
  1370. @accel_4coeff:
  1371.     shl            ebp, 2
  1372.     mov            eax, [esp+8+16]            ;eax = row pointer table
  1373.     mov            esi, [eax+12]
  1374.     mov            ecx, [eax+8]
  1375.     mov            ebx, [eax+4]
  1376.     mov            eax, [eax]
  1377.     lea            edi, [edi+ebp-4]
  1378.     neg            ebp
  1379.  
  1380.     ;registers:
  1381.     ;
  1382.     ;EAX    source 0
  1383.     ;EBX    source 1
  1384.     ;ECX    source 2
  1385.     ;ESI    source 3
  1386.     ;EDI    destination
  1387.     ;EBP    counter
  1388.     ;
  1389.     movq        xmm4, qword ptr [edx]                ;xmm4 = coeff 0/1
  1390.     movq        xmm5, qword ptr [edx+8]            ;xmm5 = coeff 2/3
  1391.     punpcklqdq    xmm4, xmm4
  1392.     punpcklqdq    xmm5, xmm5
  1393.  
  1394.     add            ebp, 4
  1395.     jz            @oddpixel_4coeff
  1396.  
  1397. @pixelloop_4coeff_dualpel:
  1398.     movq        xmm0, qword ptr [eax]
  1399.     movq        xmm1, qword ptr [ebx]
  1400.     movq        xmm2, qword ptr [ecx]
  1401.     movq        xmm3, qword ptr [esi]
  1402.     add            eax,8
  1403.     add            ebx,8
  1404.     add            ecx,8
  1405.     add            esi,8
  1406.     punpcklbw    xmm0, xmm1
  1407.     punpcklbw    xmm2, xmm3
  1408.     movdqa        xmm1, xmm0
  1409.     movdqa        xmm3, xmm2
  1410.     punpcklbw    xmm0, xmm7
  1411.     punpckhbw    xmm1, xmm7
  1412.     punpcklbw    xmm2, xmm7
  1413.     punpckhbw    xmm3, xmm7
  1414.     pmaddwd        xmm0, xmm4
  1415.     pmaddwd        xmm1, xmm4
  1416.     pmaddwd        xmm2, xmm5
  1417.     pmaddwd        xmm3, xmm5
  1418.     paddd        xmm0, xmm2
  1419.     paddd        xmm1, xmm3
  1420.     paddd        xmm0, xmm6
  1421.     paddd        xmm1, xmm6
  1422.     psrad        xmm0, 14
  1423.     psrad        xmm1, 14
  1424.     packssdw    xmm0, xmm1
  1425.     packuswb    xmm0, xmm0
  1426.     movq        qword ptr [edi+ebp],xmm0
  1427.     add            ebp, 8
  1428.     jae            @pixelloop_4coeff_dualpel
  1429.     jnz            @xit
  1430.  
  1431. @oddpixel_4coeff:
  1432.     movd        xmm0, dword ptr [eax]
  1433.     movd        xmm1, dword ptr [ebx]
  1434.     movd        xmm2, dword ptr [ecx]
  1435.     movd        xmm3, dword ptr [esi]
  1436.     punpcklbw    xmm0, xmm1
  1437.     punpcklbw    xmm2, xmm3
  1438.     punpcklbw    xmm0, xmm7
  1439.     punpcklbw    xmm2, xmm7
  1440.     pmaddwd        xmm0, xmm4
  1441.     pmaddwd        xmm2, xmm5
  1442.     paddd        xmm0, xmm2
  1443.     paddd        xmm0, xmm6
  1444.     psrad        xmm0, 14
  1445.     packssdw    xmm0, xmm0
  1446.     packuswb    xmm0, xmm0
  1447.     movd        dword ptr [edi],xmm0
  1448.     jmp            @xit
  1449.  
  1450.  
  1451. @accel_6coeff:
  1452.     movq        xmm4, qword ptr [edx]                ;xmm4 = coeff 0/1
  1453.     movq        xmm5, qword ptr [edx+8]            ;xmm5 = coeff 2/3
  1454.     movq        xmm6, qword ptr [edx+16]            ;xmm5 = coeff 4/5
  1455.     punpcklqdq    xmm4, xmm4
  1456.     punpcklqdq    xmm5, xmm5
  1457.     punpcklqdq    xmm6, xmm6
  1458.  
  1459.     push        0
  1460.     push        fs:dword ptr [0]
  1461.     mov            fs:dword ptr [0],esp
  1462.  
  1463.     shl            ebp, 2
  1464.     mov            eax, [esp+8+24]            ;eax = row pointer table
  1465.     mov            esp, [eax+20]
  1466.     mov            esi, [eax+16]
  1467.     mov            edx, [eax+12]
  1468.     mov            ecx, [eax+8]
  1469.     mov            ebx, [eax+4]
  1470.     mov            eax, [eax]
  1471.     lea            edi, [edi+ebp-4]
  1472.     neg            ebp
  1473.  
  1474.     ;registers:
  1475.     ;
  1476.     ;EAX    source 0
  1477.     ;EBX    source 1
  1478.     ;ECX    source 2
  1479.     ;EDX    source 3
  1480.     ;ESI    source 4
  1481.     ;EDI    destination
  1482.     ;ESP    source 5
  1483.     ;EBP    counter
  1484.     ;
  1485.  
  1486.     add            ebp, 4
  1487.     jz            @oddpixel_6coeff
  1488.  
  1489. @pixelloop_6coeff_dualpel:
  1490.     movq        xmm0, qword ptr [eax]
  1491.     movq        xmm1, qword ptr [ebx]
  1492.     movq        xmm2, qword ptr [ecx]
  1493.     movq        xmm3, qword ptr [edx]
  1494.     add            eax,8
  1495.     add            ebx,8
  1496.     add            ecx,8
  1497.     add            edx,8
  1498.     punpcklbw    xmm0, xmm1
  1499.     punpcklbw    xmm2, xmm3
  1500.     movdqa        xmm1, xmm0
  1501.     movdqa        xmm3, xmm2
  1502.     punpcklbw    xmm0, xmm7
  1503.     punpckhbw    xmm1, xmm7
  1504.     punpcklbw    xmm2, xmm7
  1505.     punpckhbw    xmm3, xmm7
  1506.     pmaddwd        xmm0, xmm4
  1507.     pmaddwd        xmm1, xmm4
  1508.     pmaddwd        xmm2, xmm5
  1509.     pmaddwd        xmm3, xmm5
  1510.     paddd        xmm0, xmm2
  1511.     paddd        xmm1, xmm3
  1512.  
  1513.     movq        xmm2, qword ptr [esi]
  1514.     movq        xmm3, qword ptr [esp]
  1515.     add            esi, 8
  1516.     add            esp, 8
  1517.     punpcklbw    xmm2, xmm3
  1518.     movdqa        xmm3, xmm2
  1519.     punpcklbw    xmm2, xmm7
  1520.     punpckhbw    xmm3, xmm7
  1521.     pmaddwd        xmm2, xmm6
  1522.     pmaddwd        xmm3, xmm6
  1523.     paddd        xmm0, xmm2
  1524.     paddd        xmm1, xmm3
  1525.     paddd        xmm0, xmmword ptr MMX_roundval
  1526.     paddd        xmm1, xmmword ptr MMX_roundval
  1527.     psrad        xmm0, 14
  1528.     psrad        xmm1, 14
  1529.     packssdw    xmm0, xmm1
  1530.     packuswb    xmm0, xmm0
  1531.     movq        qword ptr [edi+ebp],xmm0
  1532.     add            ebp, 8
  1533.     jae            @pixelloop_6coeff_dualpel
  1534.     jnz            @xit_6coeff
  1535.  
  1536. @oddpixel_6coeff:
  1537.     movd        xmm0, dword ptr [eax]
  1538.     movd        xmm1, dword ptr [ebx]
  1539.     movd        xmm2, dword ptr [ecx]
  1540.     movd        xmm3, dword ptr [edx]
  1541.     punpcklbw    xmm0, xmm1
  1542.     punpcklbw    xmm2, xmm3
  1543.     movd        xmm1, dword ptr [esi]
  1544.     movd        xmm3, dword ptr [esp]
  1545.     punpcklbw    xmm0, xmm7
  1546.     punpcklbw    xmm2, xmm7
  1547.     pmaddwd        xmm0, xmm4
  1548.     punpcklbw    xmm1, xmm3
  1549.     pmaddwd        xmm2, xmm5
  1550.     punpcklbw    xmm1, xmm7
  1551.     pmaddwd        xmm1, xmm6
  1552.     paddd        xmm0, xmm2
  1553.     paddd        xmm1, xmmword ptr MMX_roundval
  1554.     paddd        xmm0, xmm1
  1555.     psrad        xmm0, 14
  1556.     packssdw    xmm0, xmm0
  1557.     packuswb    xmm0, xmm0
  1558.     movd        dword ptr [edi],xmm0
  1559.  
  1560. @xit_6coeff:
  1561.     mov            esp,fs:dword ptr [0]
  1562.     pop            fs:dword ptr [0]
  1563.     pop            eax
  1564.     jmp            @xit
  1565.  
  1566. _vdasm_resize_table_col_SSE2    endp
  1567.  
  1568.     end
  1569.